home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / ERSETZE.DI < prev    next >
Encoding:
Text File  |  1989-08-12  |  3.3 KB  |  101 lines

  1. PROCEDURE Ersetze (oldName, wildcard: ARRAY OF CHAR; VAR new: ARRAY OF CHAR);
  2. (*
  3.  * Bildet aus wildcard und oldName einen neuen Dateinamen (new).
  4.  * oldName sollte keine Joker enthalten!  
  5.  * new sollte mindestens ARRAY [0..11] OF CHAR sein.
  6.  * Beispiele:
  7.  *
  8.  *      oldName       |  wildcard    |  new
  9.  *     ---------------+--------------+----------------
  10.  *      ALFONS.TXT    |  E*.MOD      |  ELFONS.MOD
  11.  *      ALFONS.TXT    |  HANS.DOC    |  HANS.DOC
  12.  *      ALFONS.TXT    |  HANS*.DOC   |  HANSNS.DOC
  13.  *      EDITOR.MOD    |  *.I         |  EDITOR.I  
  14.  *      EDITSHEL.MOD  |  ??Y?.I??    |  EDYT.IOD
  15.  *      EDITSHEL.MOD  |  ??Y*.I      |  EDYTSHEL.IOD
  16.  *
  17.  * Es werden also Dateinamen ggf. gekürzt oder verlängert!
  18.  *)
  19.  
  20. CONST cMaxLen =  11;
  21.       cPrefLen =  8;
  22.  
  23.  PROCEDURE MachMaske(wild: ARRAY OF CHAR; VAR maske: ARRAY OF CHAR);
  24.  (*
  25.   * Expandiert einen Dateinamen auf 12 Zeichen, ? und * werden als ?
  26.   * eingetragen. Nichtvorhandene Zeichen werden Blanks!
  27.   * maske sollte mindestens ein ARRAY [0..11] OF CHAR sein!
  28.   *)
  29.   VAR c:   CARDINAL;  (* Indexzähler in der neuen Maske *)
  30.       d:   CARDINAL;  (* Indexzähler in der Wildcard *)
  31.       i:   CARDINAL;  (* Allgemeiner Zähler *)
  32.  
  33.  BEGIN (* MachMaske *)
  34.   c:= 0;  d:= 0;
  35.   maske:= "????????????"; (* Vorgefertigte Maske *)
  36.   LOOP 
  37.    IF (wild[d] = CHR(0)) OR (d = HIGH(wild)) THEN
  38.     (* Wildcard zu Ende, Rest der Maske mit Blanks auffüllen *)
  39.     FOR i:= c TO cMaxLen DO maske[i]:= " "; END;
  40.     RETURN;
  41.    ELSIF (wild[d] = "*") THEN
  42.     (* Auf einen * muß ein Punkt in der Wildcard folgen! *E*.MOD ist illegal! *)
  43.     INC(d, 2); (* Punkt auslassen *)
  44.     EXIT; (* Fertig mit Prefix-Teil *)
  45.    ELSIF (wild[d] = ".") THEN
  46.     (* Punkt gefunden, Prefix bis zur Maximalen Länge mit Blanks auffüllen *)
  47.     FOR i:= c TO cPrefLen DO  maske[i]:= " ";  END; 
  48.     INC(d);
  49.     EXIT; (* Fertig mit Prefix-Teil *)
  50.    ELSE (* Zeichen aus wild nach maske übertragen *)
  51.     maske[c]:= wild[d];  INC(c);  INC(d);
  52.    END;
  53.   END;
  54.   c:= cPrefLen + 1; (* Index von maske auf "nach dem Punkt" einstellen *)
  55.   LOOP
  56.    IF (wild[d] = CHR(0)) OR (d = HIGH(wild)) THEN
  57.     (* Wildcard zu Ende, Rest der Maske mit Blanks auffüllen *)
  58.     FOR i:= c TO cMaxLen DO maske[i]:= " "; END;
  59.     RETURN;
  60.    END;
  61.    IF (c > cMaxLen) OR (wild[d]="*") THEN 
  62.     EXIT (* wild fertig, bzw. maske voll *)
  63.    END;
  64.    (* Zeichen aus wild nach maske übertragen *)
  65.    maske[c]:= wild[d]; INC(c); INC(d); 
  66.   END;
  67.  END MachMaske;
  68.  
  69.  
  70. VAR c, d: CARDINAL;
  71.     wild, maske: einDateiName; (* ARRAY [0..11] OF CHAR *)
  72.  
  73. BEGIN (* Ersetze *)
  74.  MachMaske(wildcard, wild); (* Masken erstellen *)
  75.  MachMaske(oldName, maske);
  76.  
  77.  (* Alle legalen Zeichen aus wild nach maske übertragen (auch Blanks!) *)
  78.  FOR c:= 0 TO cMaxLen DO
  79.   IF wild[c] <> "?" THEN maske[c]:= wild[c] END;
  80.  END;
  81.  
  82.  (* new zur Sicherheit löschen *)
  83.  FOR c:= 0 TO cMaxLen DO new[c]:= CHR(0);  END;
  84.  
  85.  c:= 0;  d:= 0;
  86.  LOOP
  87.   IF (d > cMaxLen) THEN EXIT END; (* Neuer Name fertig *)
  88.   IF d = cPrefLen THEN (* Punktposition, Punkt in new einsetzen *)
  89.    new[c]:= ".";  INC(c);  INC(d); 
  90.   END;
  91.   IF (maske[d] <> "?") AND (maske[d] <> " ") THEN  
  92.    (* Blanks und ? aussparen, haben nix im neuen Namen zu suchen! *)
  93.    new[c]:= maske[d];  INC(c); INC(d);
  94.   ELSE
  95.    INC(d);
  96.   END;
  97.  END;
  98.  
  99. END Ersetze;
  100.  
  101.